package comJwt

import (
	"context"
	"errors"
	"github.com/golang-jwt/jwt/v4"
	"google.golang.org/grpc/metadata"
)

type UserStdClaims struct {
	NickName string `json:"nick_name"` // 用户名
	Account  string `json:"account"`   // 账号
	Phone    string `json:"phone"`     // 手机号
	Sex      string `json:"sex"`       // 性别
	UUID     string `json:"uuid"`
	Address  string `json:"address"` // 地址
	Shops    string `json:"shops"`   // 关联店铺
	Auth     int64  `json:"auth"`    // 权限
	//*models.User
	jwt.RegisteredClaims
}

func GetToken(claims UserStdClaims, key string) (token string, err error) {
	token, err = jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(key))
	if err != nil {
		return "", err
	}
	return token, nil
}

// BackUser  rpc 可以通过上下文获取到user
func BackUser(ctx context.Context, config Auth) (*UserStdClaims, error) {
	headers, flag := metadata.FromIncomingContext(ctx)
	var Claims *UserStdClaims
	if !flag {
		return Claims, errors.New("rpc未获取到上下文")
	}
	datas := headers.Get("Authorization")
	if len(datas) == 0 {
		return Claims, errors.New("rpc未获取到token")
	}
	token, err := jwt.ParseWithClaims(datas[0], &UserStdClaims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(config.AccessSecret), nil
	})
	if err != nil {
		return nil, err
	}
	if !token.Valid {
		return nil, errors.New("解析失败")
	}
	Claims, ok := token.Claims.(*UserStdClaims)
	if !ok {
		return nil, errors.New("解析失败")
	}
	return Claims, nil
}
